001    /*
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: 2002-10-22
005     * Time: 20:12:14
006     * To change this template use Options | File Templates.
007     */
008    
009    package EVolve.util;
010    
011    import java.awt.*;
012    import java.util.*;
013    
014    public class ColorCache implements Cloneable{
015        private HashMap colorMap;
016        private Random random;
017        private final long seed = 2003213813;
018        private Color[] defaultColors = {
019            new Color(51,153,204), new Color(51,204,153), new Color(153,204,51),new Color(153,51,204),
020            new Color(204,51,153), new Color(204,153,51), new Color(51,204,0),new Color(51,0,204),
021            new Color(204,0,51), new Color(204,51,0), new Color(0,51,204),new Color(0,204,51),
022            new Color(204,0,204), new Color(204,204,0), new Color(0,204,204),new Color(51,153,0),
023            new Color(51,0,153), new Color(153,0,51), new Color(153,51,0),new Color(0,51,153),
024            new Color(0,153,51), new Color(153,204,0), new Color(153,0,204),new Color(0,204,153),
025            new Color(0,153,204), new Color(204,0,153), new Color(204,153,0),new Color(151,255,151),
026            new Color(255,151,151), new Color(151,151,255), new Color(204,204,255),new Color(255,204,204),
027            new Color(204,255,204), new Color(251,151,180), new Color(251,180,151),new Color(151,180,251),
028            new Color(151,251,180), new Color(180,251,151), new Color(180,151,251),new Color(145,244,45),
029            new Color(145,45,244), new Color(45,244,145), new Color(45,145,244),new Color(244,145,45),
030            new Color(244,45,145), new Color(244,145,45), new Color(0,0,255),new Color(255,0,0),
031            new Color(0,255,0), new Color(130,28,247), new Color(130,247,28),new Color(247,28,130),
032            new Color(247,130,28), new Color(28,247,130), new Color(198,130,247),new Color(0,128,255),
033            new Color(0,255,128), new Color(255,128,0), new Color(255,0,128),new Color(128,0,255),
034            new Color(255,128,0), new Color(128,255,0), new Color(187,156,26),new Color(25,250,104)
035        };
036        private int leftColor;
037    
038        public ColorCache() {
039            colorMap = new HashMap();
040            leftColor = defaultColors.length -1;
041            random = new Random();
042            random.setSeed(seed);
043        }
044    
045        private Color getRandomColor() {
046            int sum = 0;
047            int rand[] = new int[3];
048    
049            if (leftColor>=0) {
050                return defaultColors[leftColor--];
051            }
052    
053            do {
054                while (sum<70) {
055                    for (int i=0; i<rand.length;i++) {
056                        rand[i] = 500;
057                        while (rand[i]>255) {
058                            rand[i] = (int)(random.nextDouble()*10000);
059                        }
060                    }
061                    sum = rand[0] + rand[1] + rand[2];
062                }
063                sum = 0;
064            } while (colorMap.containsValue(new Color(rand[0],rand[1],rand[2])));
065    
066            return new Color(rand[0],rand[1],rand[2]);
067        }
068    
069        public Color getNextColor(long methodId) {
070            Color color;
071            if (!colorMap.containsKey(new Long(methodId))) {
072                color = getRandomColor();
073                colorMap.put(new Long(methodId),color);
074                return color;
075            }
076            return (Color)colorMap.get(new Long(methodId));
077        }
078    
079        public int getKeyFromColor(Color color) {
080            Iterator it = colorMap.keySet().iterator();
081            int methodId = -1;
082    
083            while (it.hasNext()) {
084                Long key = (Long)it.next();
085                if (color != ((Color)colorMap.get(key))) continue;
086    
087                methodId = key.intValue();
088                return methodId;
089            }
090            return methodId;
091        }
092    
093        public Object clone() {
094            ColorCache o = null;
095            try {
096                o = (ColorCache)super.clone();
097            } catch (CloneNotSupportedException e) {
098                e.printStackTrace();
099                return null;
100            }
101            o.colorMap = (HashMap)colorMap.clone();
102            o.defaultColors = new Color[defaultColors.length];
103            for (int i=0; i<defaultColors.length; i++)
104                o.defaultColors[i] = defaultColors[i];
105            return o;
106        }
107    }